odoo.define('web_notify.WebClient', function (require) {
    "use strict";

    var WebClient = require('web.WebClient');
    var base_bus = require('bus.Longpolling');
    var session = require('web.session');
    require('bus.BusService');


    WebClient.include({
        show_application: function () {
            var res = this._super();
            this.start_polling();
            return res;
        },
        start_polling: function () {
            this.channel_success = 'notify_success_' + session.uid;
            this.channel_danger = 'notify_danger_' + session.uid;
            this.channel_warning = 'notify_warning_' + session.uid;
            this.channel_info = 'notify_info_' + session.uid;
            this.channel_default = 'notify_default_' + session.uid;
            this.all_channels = [
                this.channel_success,
                this.channel_danger,
                this.channel_warning,
                this.channel_info,
                this.channel_default,
            ];

            // startPolling to get this new tab registered,
            // in order to be able to call isMasterTab
            this.call('bus_service', 'startPolling');

            // - no need to add channels again if it was done already
            // - this is also a workaround for the infinite loop issue
            //   that occures when user logs in as a different user
            //   while still being logged in 2+ other tabs
            if(this.call('bus_service', 'isMasterTab')) {
                this.call('bus_service', 'addChannel', this.channel_success);
                this.call('bus_service', 'addChannel', this.channel_danger);
                this.call('bus_service', 'addChannel', this.channel_warning);
                this.call('bus_service', 'addChannel', this.channel_info);
                this.call('bus_service', 'addChannel', this.channel_default);
            }

            this.call(
                'bus_service', 'on', 'notification',
                this, this.bus_notification);
        },
        bus_notification: function (notifications) {
            var self = this;
            _.each(notifications, function (notification) {
                var channel = notification[0];
                var message = notification[1];
                if (
                    self.all_channels != null &&
                    self.all_channels.indexOf(channel) > -1
                ) {
                    self.on_message(message);
                }
            });
        },
        on_message: function (message) {
            return this.call(
                'notification', 'notify', {
                    type: message.type,
                    title: message.title,
                    message: message.message,
                    sticky: message.sticky,
                    className: message.className,
                }
            );
        },
    });

});
